const express = require('express')
// const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')
const multipart = require('connect-multiparty')
const atob = require('atob')
const webpack = require('webpack')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpackHotMiddleware = require('webpack-hot-middleware')
const WebpackConfig = require('./webpack.config')
const path = require('path')

require('./server2')

const app = express()  // 创建一个 Express 应用实例，用于处理 HTTP 请求
const compiler = webpack(WebpackConfig)  //使用 Webpack 配置文件创建一个 Webpack 编译器，用于编译项目代码。

app.use(webpackDevMiddleware(compiler, {  // 将 Webpack 编译后的文件输出到内存中，并提供给 Express 应用使用
  publicPath: '/__build__/',// 编译后文件的公共访问路径，需与 Webpack 配置中的 output.publicPath 一致
  stats: {
    colors: true,// 启用彩色日志输出，便于阅读
    chunks: false// 隐藏打包过程中生成的 chunk 信息，简化日志
  }
}))

app.use(webpackHotMiddleware(compiler)) //启用 Webpack 的热更新功能，当代码发生变化时，自动更新页面而无需刷新。
// ---------------------- 静态文件服务 ----------------------
app.use(express.static(__dirname, {
  setHeaders(res) {
    res.cookie('XSRF_TOKEN_D', '1234abc')
  }
}))// 允许客户端访问当前目录下的静态文件（如 HTML、CSS、图片等）

// ---------------------- 请求体解析中间件（Express 内置，替代已弃用的 body-parser）----------------------
// app.use(bodyParser.json())
app.use(express.json()) // 解析 JSON 格式的请求体

// app.use(bodyParser.urlencoded({ extended: true }))
app.use(express.urlencoded({ extended: true }))// 解析 URL 编码的请求体（如 application/x-www-form-urlencoded）
// extended: true 表示使用 qs 库解析复杂对象（false 则使用简单的 querystring 库）

app.use(cookieParser)

app.use(multipart({
  uploafDir: path.resolve(__dirname, 'upload-fole')
}))

// ---------------------- 路由配置 ----------------------
const router = express.Router()// 创建路由实例，用于定义 API 接口

registerSimpleRouter()

registerBaseRouter()

registerErrorRouter()

registerExtendRouter()

registerInterceptorRouter()

registerConfigRouter()

registerCancelRouter()

registerMoreRouter()

app.use(router)// 将路由挂载到 Express 应用，使路由生效


// ---------------------- 启动服务器 ----------------------
// 获取环境变量中的端口号（如 Heroku 部署时使用），默认端口 8080
const port = process.env.PORT || 8080
// 启动服务器并监听端口，成功后打印启动信息
module.exports = app.listen(port, () => {
  console.log(`Server listening on http://localhost:${port},
Ctrl+C to stop`);
})

function registerSimpleRouter() {
  router.get('/simple/get', function (req, res) {
    res.json({
      msg: `hello world`
    })
  })
}

function registerBaseRouter() {
  router.get('/base/get', function (req, res) {
    res.json(req.query)
  })

  router.post('/base/post', function (req, res) {
    res.json(req.body)
  })

  router.post('/base/buffer', function (req, res) {
    let msg = []
    req.on('data', (chunk) => {
      if (chunk) {
        msg.push(chunk)
      }
    })
    req.on('end', () => {
      let buf = Buffer.concat(msg)
      res.json(buf.toJSON())
    })
  })
}

function registerErrorRouter() {
  router.get('/error/get', function (req, res) {
    if (Math.random() > 0.5) {
      res.json({
        msg: `hello world`
      })
    } else {
      res.status(500)
      res.end()
    }
  })

  router.get('/error/timeout', function (req, res) {
    setTimeout(() => {
      res.json({
        msg: `hello world`
      })
    }, 3000)
  })
}

function registerExtendRouter() {
  router.get('/extend/get', function (req, res) {
    res.json({
      msg: 'hello world'
    })
  })

  router.options('/extend/options', function (req, res) {
    res.end()
  })

  router.delete('/extend/delete', function (req, res) {
    res.end()
  })

  router.head('/extend/head', function (req, res) {
    res.end()
  })

  router.post('/extend/post', function (req, res) {
    res.json(req.body)
  })

  router.put('/extend/put', function (req, res) {
    res.json(req.body)
  })

  router.patch('/extend/patch', function (req, res) {
    res.json(req.body)
  })

  router.get('/extend/user', function (req, res) {
    res.json({
      code: 0,
      message: 'ok',
      result: {
        name: 'jack',
        age: 18
      }
    })
  })
}

function registerInterceptorRouter() {
  router.get('/interceptor/get', function (req, res) {
    res.end('hello')
  })
}

function registerConfigRouter() {
  router.post('/config/post', function (req, res) {
    res.json(req.body)
  })
}

function registerCancelRouter() {
  router.get('/cancel/get', function (req, res) {
    setTimeout(() => {
      res.json('hello')
    }, 1000)
  })

  router.post('/cancel/post', function (req, res) {
    setTimeout(() => {
      res.json(req.body)
    }, 1000)
  })
}

function registerMoreRouter() {
  router.get('/more/get', function (req, res) {
    res.json(req.cookies)
  })

  router.post('/more/upload', function (req, res) {
    console.log(req.body, req.files)
    res.end('upload success!')
  })

  router.post('/more/post', function (req, res) {
    const auth = req.headers.authorization
    const [type, credentials] = auth.split(' ')
    console.log(atob(credentials))
    const [username, password] = atob(credentials).split(':')
    if (type === 'Basic' && username === 'Yee' && password === '123456') {
      res.json(req.body)
    } else {
      res.status(401)
      res.end('UnAuthorization')
    }
  })

  router.get('/more/304', function (req, res) {
    res.status(304)
    res.end()
  })

  router.get('/more/A', function (req, res) {
    res.end('A')
  })

  router.get('/more/B', function (req, res) {
    res.end('B')
  })
}


